﻿#ifndef TLV_H
#define TLV_H

#include "bytes.h"
#include <QString>
#include <QMetaType>

enum TlvTag {
    // 预留tag
    Tlv_NULL                       = 0,       // 占位
    Tlv_seq_id                     = 0,       // 通讯ID
    Tlv_status                     = 1,       // 通讯状态
    Tlv_reserve                    = 2,       // 通讯预留

    // 应用tag
    Tlv_IIC_feedback               = 3,       // IICA0反馈
    Tlv_IIC_IIC_CALL               = 4,       // IICA0调用
    Tlv_Interrupt_resp             = 5,       // 中断响应
    Tlv_MCU_RESET                  = 8,       // MCU复位
    Tlv_TOUCH_EVENT                = 9,       // 标准触摸报点
    Tlv_MCU_Product_STATUS         = 10,      // mcu产品(项目)状态，例如adc、ntc、背光fault等
    Tlv_MCU_Release_TimeStamp      = 11,      // 软件释放时间戳
    Tlv_MCU_RAM_Data               = 12,      // mcu指定RAM的值
    Tlv_MCU_Product_STD_Frame      = 13,      // 产品通讯_标准帧
    Tlv_MCU_Product_EXT_Frame      = 14,      // 产品通讯_扩展帧
    Tlv_MCU_Product_REC_Frame      = 15,      // 产品通讯_接收帧
    Tlv_MCU_Warning                = 16,      // mcu发出的警告消息（具体场景自定义）
    Tlv_MCU_String                 = 17,      // mcu发出的字符串信息（具体场景自定义）
    Tlv_MCU_Dump                   = 18,      // 前4字节为地址，mcu将自身内存传出，需先发tag19
    Tlv_MCU_DumpControl            = 19,      // dump控制信息（开始结束、起始地址等）
    Tlv_MCU_ROM_Data               = 20,      // mcu指定ROM的值
    Tlv_MCU_BOOT_APP_REQ           = 21,      // 请求boot还是APP
    Tlv_MCU_BOOT_APP_RSP           = 22,      // [1=boot, 2=APP] + N字节版本信息
    Tlv_MCU_Program_REQ            = 23,      // 4字节地址(大端) + N字节数据
    Tlv_MCU_Program_RSP            = 24,      // 4字节地址(大端) + 1字节结果(0成功，其它失败原因)
    Tlv_MCU_Enter_BOOT             = 25,      // 请求进入boot
    Tlv_MCU_CAN_TX_REQ             = 26,      // 15765消息
    Tlv_MCU_CAN_TX_RSP             = 27,      // TBD
    Tlv_MCU_CAN_RX                 = 28,      // 15765消息
    Tlv_MCU_SET_IO                 = 29,      // 2字节编号 + 1字节类型(1高低电平,2PWM) + 2字节值(65535=PWM100%)
    Tlv_MCU_ADC_REQ                = 30,      // 2字节编号
    Tlv_MCU_ADC_RSP                = 31,      // 2字节编号 + 2字节ADC值
    Tlv_MCU_REQ_RSP                = 32,      // 通用响应: 2字节cmdid + 1字节状态; 状态: 1未定义; 2未实现; 3非自身功能
    Tlv_PL_IIC_RSP                 = 33,      // 产线IIC响应，60805(ED85)响应
    Tlv_IntnCall_RSP               = 34,      // 内置函数请求响应，60806(ED86)响应
    Tlv_PL_IIC_REQ                 = 0xED85,  // 产线IIC请求
    Tlv_IntnCall                   = 0xED86   // 内置函数请求
};

class Tlv
{
public:
    explicit Tlv(TlvTag tlvTag=TlvTag::Tlv_NULL, const QByteArray& tlvValue=QByteArray());

    TlvTag tag() const;
    QByteArray value() const;

    QByteArray toBytes() const;
    virtual QString toLog() const;

    bool isIicFeedback() const;
    bool isIicCall() const;

    void setRequestMode(bool req) const;

    static QString tagStr(const TlvTag& tag);
    static Tlv tlvNull();
    static const QList<TlvTag> allTags();

private:
    TlvTag m_tag;
    QByteArray m_value;
    mutable bool m_isReq;
};

Q_DECLARE_METATYPE(Tlv)

#endif // TLV_H
